<?php

/*
* Класc для работы с поисковыми индексами
*
*/
class Search_Indexes {
	// Список индексов <array>
	private $_indexes;

	// Отношение индекс => модель <array>
	private $_models;

	/**
	 * Маппинг id моделей для построения поискового запроса
	 *
	 * @var unknown_type
	 */
	private $_model_ids;

	/**
	 * Маппинг поисковых типов индекс => тип
	 *
	 * @var array
	 */
	private $_stypes;

	/**
	 * Маппинг ContentListElement типа для некоторых индексов
	 *
	 * @var array
	 */
	private $_contentListTypes;

	/**
	 * Инстанс класса
	 *
	 * @var SearchIndexes
	 */
	private static $_instance = null;

	/**
	 * Порядок индексов в массиве _indexes будет соответсвовать порядку вывода
	 * результатов поиска
	 *
	 */
	private function __construct() {
		$this->_indexes = array(
			'product',
			'news',
			'share',
			'pages',
			'shop',
			'custom_category'
		);

		$this->_contentListTypes = array(
		);

		$this->_models = array(
			'news' => 'NewsPeer',
			'share' => 'NewsPeer',
			'product' => 'ProductPeer',
			'pages' => 'StaticPagePeer',
			'shop' => 'ShopPeer',
			'custom_category' => 'ProductPeer',
		);

		$this->_model_ids = array(
			'news' => NewsPeer::ID,
			'product' => ProductPeer::ID,
			'share' => NewsPeer::ID,
			'pages' => StaticPagePeer::ID,
			'shop' => ShopPeer::ID,
			'custom_category' => ProductPeer::ID,
		);

		$this->_stypes = array(
			"news" => array("typename" => "news", "title" => "Новости"),
			"product" => array("typename" => "product", "title" => "Товары"),
			"share" => array("typename" => "share", "title" => "Акции"),
			"pages" => array("typename" => "pages", "title" => "Страницы"),
			"shop" => array("typename" => "shop", "title" => "Магазины"),
			//"custom_category" => array("typename" => "custom_category", "title" => "Товары"),
		);
	}

	/**
	 * Создаем инстанс
	 *
	 * @return SearchIndexes
	 */
	public static function getInstance() {
		if (is_null(self::$_instance)) {
			self::$_instance = new self();
		}

		return self::$_instance;
	}

	/**
	 * Метод получения поисковых индексов
	 *
	 * @return array
	 */
	public function getIndexes() {
		return $this->_indexes;
	}

	/**
	 * Получение индекса по номеру
	 *
	 * @param int $indexNumber
	 * @return string
	 */
	public function getIndex($indexNumber) {
		return $this->_indexes[$indexNumber];
	}

	/**
	 * Получение модели по индексу
	 *
	 * @param string $index_name
	 * @return string
	 */
	public function getIndexModel($index_name) {
		return $this->_models[$index_name];
	}

	/**
	 * Получени ID модели для построения поискового запроса.
	 *
	 * @param string $index_name
	 * @return string
	 */
	public function getModelId($index_name) {
		return $this->_model_ids[$index_name];
	}

	/**
	 * Получение поисковых типов по которым есть результаты
	 *
	 * @param array $indexes
	 * @return array
	 */
	public function getStypes($indexes) {
		$tmp_array = array_diff_key($this->_stypes, $indexes);
		return array_diff_key($this->_stypes, $tmp_array);
	}

	/**
	 * Получение типа по имени индекса
	 *
	 * @param string $indexName
	 * @return array
	 */
	public function getStype($indexName) {
		return $this->_stypes[$indexName];
	}

	/**
	 * Получение номера индекса по имени
	 *
	 * @param string $indexName
	 * @return int
	 */
	public function getIndexNumber($indexName) {
		$temp_array = array_flip($this->_indexes);
		return $temp_array[$indexName];
	}

	/**
	 * Сущесвтует ли ключ в списке индексов
	 *
	 * @param string $name
	 * @return bool
	 */
	public function checkIndexName($name) {
		return in_array($name, $this->_indexes);
	}

	/**
	 * Получение дополнительного типа для ContentListElement'a
	 *
	 * @param string $name имя индекса
	 * @return string
	 */
	public function getContentListElementType($name) {
		return isset($this->_contentListTypes[$name]) ?
				$this->_contentListTypes[$name] : null;
	}
}